package com.study.webapp.lock;

/**
 * 守护线程与非守护
 * 
 * @author admin gc守护，用户线程非守护 2018年12月28日
 */
public class DaemonTest {

	public static void main1(String[] args) {
		// 证明main方法不是守护线程
		Thread t = Thread.currentThread();
		System.out.println(t.getName());
		System.out.println(t.isDaemon());
	}

	/**
	 * 非守护线程和主线程互不影响
	 * 
	 * @param args
	 */
	public static void main2(String[] args) {
		Thread thread = new Thread(new Runnable() {

			@Override
			public void run() {
				for (int i = 0; i < 90; i++) {
					System.out.println("用户线程》》" + i + ",is>>" + Thread.currentThread().isDaemon());
				}
			}

		});
		thread.start();
		for (int i = 0; i < 5; i++) {
			System.out.println("主线程》》" + i + ",is>>" + Thread.currentThread().isDaemon());
		}
		System.out.println("主线程执行完毕");
	}

	public static void main(String[] args) {
		Thread thread = new Thread(new Runnable() {

			@Override
			public void run() {
				for (int i = 0; i < 90; i++) {
					// 为什么既然已经变为守护线程了，却没有和主线程一起结束呢？
					// 原因是：结束线程有延迟，所以在结束线程的期间发生了还在进行“用户线程”的问题，解决办法就是在用户线程中加sleep休眠(暂停执行)即可
					try {
						// 每个300mm执行一次
						Thread.sleep(300);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					System.out.println("用户线程》》" + i + ",is>>" + Thread.currentThread().isDaemon());
				}
			}

		});
		// 将用户线程设置成守护线程，需注意要在start前设置
		thread.setDaemon(true);
		thread.start();
		for (int i = 0; i < 5; i++) {
			System.out.println("主线程》》" + i + ",is>>" + Thread.currentThread().isDaemon());
		}
		System.out.println("主线程执行完毕");
	}

}
